macro(fuzzer name)
  add_executable(${name} ${name}.cc)
  target_compile_options(${name} PRIVATE "-Wno-missing-prototypes")
  target_link_libraries(${name} crypto ${ARGN})
  if(LIBFUZZER_FROM_DEPS)
    set_target_properties(${name} PROPERTIES LINK_FLAGS "-fsanitize=fuzzer-no-link")
    target_link_libraries(${name} Fuzzer)
  else()
    set_target_properties(${name} PROPERTIES LINK_FLAGS "-fsanitize=fuzzer")
  endif()
  set_target_properties(
    ${name}
    PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED YES)
endmacro()

fuzzer(arm_cpuinfo)
fuzzer(bn_div)
fuzzer(bn_mod_exp)
fuzzer(cert)
fuzzer(client ssl)
fuzzer(conf)
fuzzer(crl_getcrlstatusforcert_fuzzer pki)
fuzzer(crl_parse_crl_certificatelist_fuzzer pki)
fuzzer(crl_parse_crl_tbscertlist_fuzzer pki)
fuzzer(crl_parse_issuing_distribution_point_fuzzer pki)
fuzzer(decode_client_hello_inner ssl)
fuzzer(der_roundtrip)
fuzzer(dtls_client ssl)
fuzzer(dtls_server ssl)
fuzzer(ocsp_parse_ocsp_cert_id_fuzzer pki)
fuzzer(ocsp_parse_ocsp_response_data_fuzzer pki)
fuzzer(ocsp_parse_ocsp_response_fuzzer pki)
fuzzer(ocsp_parse_ocsp_single_response_fuzzer pki)
fuzzer(parse_authority_key_identifier_fuzzer pki)
fuzzer(parse_certificate_fuzzer pki)
fuzzer(parse_crldp_fuzzer pki)
fuzzer(pkcs12)
fuzzer(pkcs8)
fuzzer(privkey)
fuzzer(read_pem)
fuzzer(server ssl)
fuzzer(session ssl)
fuzzer(spki)
fuzzer(ssl_ctx_api ssl)
fuzzer(verify_name_match_fuzzer pki)
fuzzer(verify_name_match_normalizename_fuzzer pki)
fuzzer(verify_name_match_verifynameinsubtree_fuzzer pki)
